# 内嵌函数：闭包通常包含一个内嵌函数，这个函数在外部函数中定义。
# 引用外部变量：内嵌函数能够访问其外部函数的局部变量，即使外部函数已经返回，闭包保存了其创建时的环境。

# 用全局变量
account_amount = 0
def atm(num, deposit=True):
    global account_amount
    if deposit:
        account_amount += num
        print(f"存款+{num}, 账户余额为：{account_amount}")
    else:
        account_amount -= num
        print(f"取款-{num}, 账户余额为：{account_amount}")
atm(100)        #存款+100, 账户余额为：100
atm(200)        #存款+200, 账户余额为：300
atm(300,deposit=False)      #取款-300, 账户余额为：0

# 用闭包方式
def account_create(initial_amount=0):
    #嵌套函数
    def atm (num, deposit=True):
        nonlocal initial_amount
# nonlocal关键字用于在嵌套函数中声明一个变量是来自外层（但不是全局）作用域的。它允许你在内嵌函数中修改外层函数的局部变量。
# 作用域：nonlocal使得内嵌函数能够访问和修改其外层函数的变量，而不是创建新的局部变量。
        if deposit:
            initial_amount += num
            print(f"存款+{num}, 账户余额为：{initial_amount}")
        else:
            initial_amount -= num
            print(f"取款-{num}, 账户余额为：{initial_amount}")
    return atm

atm1 = account_create(100)
atm1(100)
atm1(200)
atm1(300,deposit=False)